package GUI;


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Iterator;

import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.SwingConstants;
import javax.swing.border.EtchedBorder;
import javax.swing.filechooser.FileNameExtensionFilter;

import Audio.Audio;
import Linguo.Mapa;
import Objetos.Coleccionable;

import java.awt.Font;


/**
 * Interfaz grafica principal
 * @author Andres Garcia Amado, Federico Quattrocchio, Matias Lameiro.
 */
@SuppressWarnings("serial")
public class GUI extends JFrame {


	private Audio audio;

	/** Etiqueta de nafta */
	private JLabel lblNafta;

	/** Etiqueta de balas */
	private JLabel lblBalas;

	/** Etiqueta de puntos. */
	private JLabel lblPuntos;

	/** Etiqueta de item en brazo. */
	private JLabel lblItemEnBrazo;

	/** Etiqueta de Baul*/
	private JLabel lblBaul;

	/** Mapa que se esta jugando */
	protected Mapa m;

	/** La interfaz del juego */
	protected GUIJuego guiJuego;

	/** Etiqueta de item */
	private JLabel lblItem;

	/** The btn new button. */
	private JButton btnNewButton;

	/** Grupo de botones que contiene los RadioButton para seleccionar el tipo de robot. */
	private ButtonGroup grupoR;

	/** RadioButton Civil. */
	private JRadioButton rdbtnCivil;

	/** RadioButton militar. */
	private JRadioButton rdbtnMilitar;

	/** Panel inicio */
	private JPanel inicio;

	private Panel panel;

	/** Boton pintar blanco */
	private JButton botonPintarBlanco;

	/** Boton disparar. */
	private JButton botonDisparar;

	/** Boton pintar negro. */
	private JButton botonPintarNegro;

	/** Boton pincel. */
	private JButton botonPincel;

	/** Boton mover. */
	private JButton botonMover;

	/** Boton girar izquierda. */
	private JButton botonGirarIzquierda;

	/** Boton girar derecha. */
	private JButton botonGirarDerecha;

	/** Boton levantar. */
	private JButton botonLevantar;

	/** Boton guardar en baul. */
	private JButton botonGuardarEnBaul;

	/** panel_2. */
	private JPanel panel_2;

	/** Area de texto */
	private JTextArea textArea;

	/** panel_3. */
	private JPanel panel_3;

	private JPanel panel_1;

	protected int minWidth = 850;
	protected int minHeight = 400;
	private JButton btnJugarModoMilitar;
	
	private JLabel lblNewLabel;


	/**
	 * Constructor de la GUI
	 */
	public GUI() {
		setResizable(false);

		InitUI();

	}

	/**
	 * Inicializa la interfaz
	 */
	public void InitUI() {

		lblNewLabel = new JLabel("");
		lblNewLabel.setIcon(new ImageIcon(this.getClass().getResource("/imagenes/titulo.jpg")));
		lblNewLabel.setBounds(0, 0, 598, 331);

		inicio = new JPanel();

		getContentPane().setLayout(new BorderLayout(0, 0));

		getContentPane().add(inicio,BorderLayout.CENTER);
		inicio.setLayout(null);
		
			
		btnNewButton = new JButton("JUGAR MODO CIVIL");
		btnNewButton.setFont(new Font("Tibetan Machine Uni", Font.BOLD, 17));
		btnNewButton.setOpaque(false);
		btnNewButton.setContentAreaFilled(false);
		btnNewButton.setBorderPainted(false);
		btnNewButton.setForeground(Color.BLACK);
		btnNewButton.setFocusable(false);
		btnNewButton.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				jugar("Civil");
			}
			@Override
			public void mouseEntered(MouseEvent e) {
				btnNewButton.setForeground(Color.WHITE);
			}
			@Override
			public void mouseExited(MouseEvent e) {
				btnNewButton.setForeground(Color.BLACK);
			}
		});
		btnNewButton.setBounds(291, 213, 257, 24);
		inicio.add(btnNewButton);
		
		btnJugarModoMilitar = new JButton("JUGAR MODO MILITAR");
		btnJugarModoMilitar.setFont(new Font("Tibetan Machine Uni", Font.BOLD, 17));
		btnJugarModoMilitar.setOpaque(false);
		btnJugarModoMilitar.setContentAreaFilled(false);
		btnJugarModoMilitar.setBorderPainted(false);
		btnJugarModoMilitar.setForeground(Color.BLACK);
		btnJugarModoMilitar.setFocusable(false);
		btnJugarModoMilitar.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				jugar("Militar");
			}
			@Override
			public void mouseEntered(MouseEvent e) {
				btnJugarModoMilitar.setForeground(Color.WHITE);
			}
			@Override
			public void mouseExited(MouseEvent e) {
				btnJugarModoMilitar.setForeground(Color.BLACK);
			}
		});
		btnJugarModoMilitar.setBounds(229, 249, 338, 24);
		inicio.add(btnJugarModoMilitar);
		
		inicio.add(lblNewLabel);

		audio= new Audio();
		audio.doPlay("/Audio/Hydrogen.wav");


		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(600, 360);
		setLocationRelativeTo(null);
		setTitle("Linguo 2");
		setVisible(true);




	}	

	/**
	 * Inicia el nivel.
	 *
	 * @param  nivel arreglo con el nivel que se jugara
	 * @param rt el tipo de robot con el que se jugara 
	 */
	public void iniciarNivel(String [] nivel, String rt) {
		getContentPane().removeAll();
		getContentPane().setLayout(new BorderLayout(0, 0));


		guiJuego = new GUIJuego(this,nivel,rt);
		m = guiJuego.getMapa();

		JSplitPane splitPane = new JSplitPane();
		splitPane.setOrientation(JSplitPane.VERTICAL_SPLIT);
		getContentPane().add(splitPane, BorderLayout.CENTER);
		splitPane.setDividerSize(0);

		JPanel panelSuperior = new JPanel();
		splitPane.setLeftComponent(panelSuperior);
		panelSuperior.setLayout(new GridLayout(1, 0, 0, 0));


		lblNafta = new JLabel("Nafta: "+m.getNafta());
		lblNafta.setIcon(m.getMapeo().get("Nafta"));
		panelSuperior.add(lblNafta);


		lblBalas = new JLabel("Balas: "+m.getBalas());
		lblBalas.setIcon(m.getMapeo().get("Balas"));
		panelSuperior.add(lblBalas);

		lblPuntos = new JLabel("Puntos: "+m.getPuntaje());
		lblPuntos.setIcon(m.getMapeo().get("Puntos"));
		panelSuperior.add(lblPuntos);

		lblItemEnBrazo = new JLabel(" Item en Brazo: ");
		panelSuperior.add(lblItemEnBrazo);

		lblItem = new JLabel("");
		panelSuperior.add(lblItem);

		lblBaul= new JLabel("Baul:");
		panelSuperior.add(lblBaul);
		panel_3 = new JPanel();
		panelSuperior.add(panel_3);
		panel_3.setLayout(new BoxLayout(panel_3, BoxLayout.X_AXIS));

		panel_1 = new JPanel();
		splitPane.setRightComponent(panel_1);
		panel_1.setLayout(new BorderLayout(0, 0));
		panel_1.add(guiJuego, BorderLayout.CENTER);

		panel = new Panel();
		panel.setBounds(new Rectangle(400, 0, 184, 400));
		panel_1.add(panel, BorderLayout.EAST);
		panel.setLayout(null);
		panel.setFocusable(false);

		botonPintarBlanco = new JButton("");
		botonPintarBlanco.setIcon(null);
		botonPintarBlanco.setSelectedIcon(null);
		botonPintarBlanco.setIcon(m.getMapeo().get("Bucket_white_key"));
		botonPintarBlanco.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				accionBotonPintarBlanco();
			}
		});
		botonPintarBlanco.setBounds(0, 75, 60, 60);
		botonPintarBlanco.setVerticalAlignment(SwingConstants.TOP);
		panel.add(botonPintarBlanco);

		botonDisparar = new JButton("");
		botonDisparar.setIcon(m.getMapeo().get("Fire_Key"));
		botonDisparar.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {

				guiJuego.disparar();
			}
		});
		botonDisparar.setBounds(63, 75, 60, 60);
		botonDisparar.setVerticalAlignment(SwingConstants.TOP);

		panel.add(botonDisparar);

		botonPintarNegro = new JButton("");
		botonPintarNegro.setIcon(m.getMapeo().get("Bucket_black_key"));
		botonPintarNegro.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				accionBotonPintarNegro();

			}
		});

		botonPintarNegro.setBounds(124, 75, 60, 60);
		botonPintarNegro.setVerticalAlignment(SwingConstants.TOP);
		panel.add(botonPintarNegro);

		botonPincel = new JButton("");
		botonPincel.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				guiJuego.bajarSubirPincel();
			}
		});
		botonPincel.setBounds(0, 135, 60, 60);
		botonPincel.setVerticalAlignment(SwingConstants.TOP);
		botonPincel.setIcon(m.getMapeo().get("Brush_black_key"));
		panel.add(botonPincel);

		botonMover = new JButton("");
		botonMover.setForeground(new Color(0, 0, 0));
		botonMover.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
			}
		});
		botonMover.setIcon(m.getMapeo().get("Up"));
		botonMover.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				guiJuego.avanzar();
			}
		});
		botonMover.setBounds(63, 135, 60, 60);
		botonMover.setVerticalAlignment(SwingConstants.TOP);
		panel.add(botonMover);

		botonGuardarEnBaul = new JButton("");
		botonGuardarEnBaul.setEnabled(false);
		botonGuardarEnBaul.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
			}
		});
		botonGuardarEnBaul.addMouseListener(new MouseAdapter() {

			public void mouseClicked(MouseEvent e) {
				guiJuego.guardarBaul();
			}
		});
		botonGuardarEnBaul.setBounds(124, 135, 60, 60);
		botonGuardarEnBaul.setVerticalAlignment(SwingConstants.TOP);
		botonGuardarEnBaul.setIcon(m.getMapeo().get("Chest_Key"));
		panel.add(botonGuardarEnBaul);

		botonGirarIzquierda = new JButton("");
		botonGirarIzquierda.setIcon(m.getMapeo().get("Left"));
		botonGirarIzquierda.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				guiJuego.girarIzquierda();
			}
		});
		botonGirarIzquierda.setBounds(0, 195, 60, 60);
		botonGirarIzquierda.setVerticalAlignment(SwingConstants.TOP);
		panel.add(botonGirarIzquierda);

		botonLevantar = new JButton("");
		botonLevantar.setIcon(m.getMapeo().get("Down"));
		botonLevantar.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				guiJuego.agarrarDejar();
			}
		});
		botonLevantar.setBounds(63, 195, 60, 60);
		botonLevantar.setVerticalAlignment(SwingConstants.TOP);
		botonLevantar.setIcon(m.getMapeo().get("Claw_Key"));
		panel.add(botonLevantar);

		botonGirarDerecha = new JButton("");
		botonGirarDerecha.setIcon(m.getMapeo().get("Right"));
		botonGirarDerecha.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				guiJuego.girarDerecha();
			}
		});
		botonGirarDerecha.setBounds(124, 195, 60, 60);
		botonGirarDerecha.setVerticalAlignment(SwingConstants.TOP);
		panel.add(botonGirarDerecha);

		btnNewButton.setFocusable(false);
		botonDisparar.setFocusable(false);
		botonGirarDerecha.setFocusable(false);
		botonGirarIzquierda.setFocusable(false);
		botonGuardarEnBaul.setFocusable(false);
		botonLevantar.setFocusable(false);
		botonMover.setFocusable(false);
		botonPincel.setFocusable(false);
		botonPintarBlanco.setFocusable(false);
		botonPintarNegro.setFocusable(false);

		panel_2 = new JPanel();
		panel_2.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
		panel_2.setBounds(10, 11, 164, 53);
		panel.add(panel_2);
		panel_2.setLayout(new BoxLayout(panel_2, BoxLayout.X_AXIS));

		panel_1.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				accionPanel1();
			}
		});

		textArea = new JTextArea();
		textArea.setBounds(new Rectangle(400, 0, 180, 100));
		panel_2.add(textArea);
		panel_2.setFocusable(false);
		panel_1.getComponent(0).requestFocusInWindow();
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		int newWidth = m.getMapWidth()+250;
		int newHeight = m.getMapHeight()+50;
		if(newWidth<minWidth)
			newWidth = minWidth;
		if(newHeight<minHeight)
			newHeight = minHeight;
		setSize(newWidth, newHeight);
		//pack();


		//setLocationRelativeTo(null);
		setTitle("Linguo-2da entrega");
		setVisible(true);


	}

	/**
	 * Actualiza la etiqueta de la nafta.
	 */
	public void actualizarNafta() {
		lblNafta.setText("Nafta: "+m.getNafta());
	}

	/**
	 * Actualiza la etiqueta de los puntos.
	 */
	public void actualizarPuntos() {
		lblPuntos.setText("Puntos: "+m.getPuntaje());
	}

	/**
	 * Actualiza la etiqueta de las balas.
	 */
	public void actualizarBalas() {
		lblBalas.setText("Balas: "+m.getBalas());
		if (m.getBalas()==0)
			botonDisparar.setEnabled(false);
		else botonDisparar.setEnabled(true);
	}

	/**
	 * Actualiza la etiqueta de el item en brazo.
	 */
	public void actualizarItemEnBrazo() {
		if(m.getItem()!=null)
		{botonGuardarEnBaul.setEnabled(true);
		lblItem.setIcon(new ImageIcon((m.getItem().getImage())));
		}
		else{
			botonGuardarEnBaul.setEnabled(false);
			lblItem.setIcon(null);
		}
	}

	/**
	 * Metodo principal
	 *
	 * @param args argumentos
	 */
	public static void main(String[] args) {
		GUI g = new GUI();
		g.setVisible(true);
	}


	/**
	 * Actualiza los labels de los items en el baul.
	 */
	public void actualizarBaul(){
		Iterator<Coleccionable> it= m.getRobot().getBaul();
		Coleccionable elem=null;
		panel_3.removeAll();
		while(it.hasNext()){	
			elem=it.next();
			JLabel imagen= new JLabel();
			imagen.setIcon(new ImageIcon((elem.getImage())));
			panel_3.add(imagen);

		}
		repaint();
	}

	public void accionBotonPintarNegro() {
		botonPincel.setIcon(m.getMapeo().get("Brush_black_key"));
		guiJuego.pintarNegro();
	}

	public void accionBotonPintarBlanco() {
		botonPincel.setIcon(m.getMapeo().get("Brush_white_key"));
		guiJuego.pintarBlanco();
	}

	public void restartGui() {
		botonPincel.setIcon(m.getMapeo().get("Brush_black_key"));		
	}

	public void cambiarMusica(final String url) {
		audio.doPlay(url);

	}

	public void accionPanel1() {
		panel_1.getComponent(0).requestFocusInWindow();
	}

	public void jugar(String tipoRobot) {
		JFrame VentanaJuego = new JFrame("Juego Nuevo");
		JFileChooser fc = new JFileChooser();
		fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
		fc.setCurrentDirectory(new File("bin/levels"));

		FileNameExtensionFilter filtro = new FileNameExtensionFilter(
				"Niveles de Linguo 2 (.txt)", "txt");
		fc.setFileFilter(filtro);

		int respuesta = fc.showOpenDialog(VentanaJuego);
		if (respuesta == JFileChooser.APPROVE_OPTION) {
			File archivo = fc.getSelectedFile();
			fc.setCurrentDirectory(new File(" "));

			BufferedReader entrada = null;
			//StringBuffer str = new StringBuffer();
			try {
				entrada = new BufferedReader(new FileReader(archivo));
				String [] nivel = new String [6];
				for(int i = 0; i<nivel.length ;i++)
					nivel[i] = entrada.readLine();

				iniciarNivel(nivel,tipoRobot);


			} catch (IOException ex) {
			}

		}
	}
}

